2023/12/231810字符

Reflect 反射

是指计算机程序在运行时可以访问、检测和修改它本身状态或行为的一种能力。用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为。

优缺点:维基百科——反射式编程

API

const obj = {
    a: 10,
    b: 12
}
Reflect.set(obj, 'a', 100);  // 设置对象属性: obj.a = 100
Reflect.get(obj, 'a');  // 获取对象属性
Reflect.deleteProperty(obj, 'b');  // 删除对象属性
Reflect.defineProperty(obj, 'a', {  // 与 Object.defineProperty 的区别:Reflect.defineProperty 不会报错
    value: 20                       // 可以理解为 Object.defineProperty 就是调用了底层的 Reflect.defineProperty
});  //--> false
Reflect.has(obj, 'a');  // 是否存在: 'a' in obj

内置JS对象,仅ES6浏览器支持,可以访问一些底层的功能

apply

function fn (a, b) {
    console.log(a, b);
}
        // 函数、this指向、参数
Reflect.apply(fn, null, [3, 5]);  // 函数调用: fn(3, 5);

构造函数

function Car (a, b) {
    this.a = a;
    this.b = b;
}
const car = Reflect.construct(Car, [1, 2]);  // 构造函数: let car = new Car(1, 2);
  • 不可构造,不能使用 new 进行调用
  • 提供的 API 比 Object 更为丰富且使用起来更为语义化
  • 所有的方法都是静态方法,类似于 Math。(静态方法是可以直接用类名.方法名去调用的;而实例方法是不可以的,必须要用实例才可以去调用)
  • 部分方法和 Object.* 相同,但行为略微有所区别。譬如 Object.defineProperty(obj, name, desc) 在无法定义属性时,会抛出一个错误,而 Reflect.defineProperty(obj, name, desc) 则会返回 false